import { getTime, symlinkCommon } from "./Utils";

import { ApiMsgEnum, IApiPlayerJoinReq, IApiPlayerJoinRes, IApiPlayerListReq, IApiPlayerListRes, IApiRoomCreateReq, IApiRoomCreateRes, IApiRoomJoinReq, IApiRoomJoinRes, IApiRoomLeaveRes, IApiRoomLeaveReq, IApiRoomListReq, IApiRoomListRes, IApiGameStartReq, IApiGameStartRes, IApiGameEndReq, IApiGameEndRes } from "./Common";
import { Connection, MyServer } from "./Core";
import { PlayerManager } from "./Biz/PlayerManager";
import { RoomManager } from "./Biz/RoomManager";
import { error } from "console";

symlinkCommon();
/**
 * 扩展 ./Core 模块中的 Connection 接口
 * 为 Connection 接口添加一个新的属性 playerId
 */
declare module "./Core" {
    interface Connection{
        playerId:number
    }
}
const server= new MyServer({
    port:9876,
})
server.on("connection",()=>{
    console.log(`${getTime()}来人|人数|${server.connections.size}`)
})
server.on("disconnection",(connection:Connection)=>{
    console.log(`${getTime()}走人|人数|${server.connections.size}`)
    if(connection.playerId){
        PlayerManager.Instance.removePlayer(connection.playerId)
    }
    //如果有玩家退出了就同步一下
    PlayerManager.Instance.syncPlayers()
})

/**
 * 注册一个处理玩家加入的API,这个方法返回player的属性
 */
server.setApi(ApiMsgEnum.ApiPlayerJoin,(connection:Connection,data:IApiPlayerJoinReq):IApiPlayerJoinRes=>{
    const{nickname} = data
    const player = PlayerManager.Instance.createPlayer({nickname,connection})
    connection.playerId=player.id
    //如果有玩家登录了就同步一下
    PlayerManager.Instance.syncPlayers()
    return{
        player:PlayerManager.Instance.getPlayerView(player)
    }
})

/**
 * 注册获取玩家列表的API
 */
server.setApi(ApiMsgEnum.ApiPlayerList,(connection:Connection,data:IApiPlayerListReq):IApiPlayerListRes=>{
    
    return{
        list:PlayerManager.Instance.getPlayersView()
    }
})

/**
 * 创建房间的API
 */
server.setApi(ApiMsgEnum.ApiRoomCreate,(connection:Connection,data:IApiRoomCreateReq):IApiRoomCreateRes=>{
    //先判断有没有连接
    if(connection.playerId){
        const newRoom = RoomManager.Instance.createRoom()
        const room=RoomManager.Instance.joinRoom(newRoom.id,connection.playerId)
        if(room){
            //如果有房间创建了就同步一下玩家和房间列表
            PlayerManager.Instance.syncPlayers()
            RoomManager.Instance.syncRooms()
            return {
                room:RoomManager.Instance.getRoomView(room)
            }
        }else{
            throw new error("房间不存在")
        }
    }else{
        //这个异常抛出给Connection的on“message”的trycatch捕获到
        throw new error("未登录")
    }
    
})

/**
 * 注册获取房间列表的API
 */
server.setApi(ApiMsgEnum.ApiRoomList,(connection:Connection,data:IApiRoomListReq):IApiRoomListRes=>{
    return{
        list:RoomManager.Instance.getRoomsView()
    }
})


/**
 * 加入房间的API
 */
server.setApi(ApiMsgEnum.ApiRoomJoin,(connection:Connection,{rid}:IApiRoomJoinReq):IApiRoomJoinRes=>{
    
    //先判断有没有连接
    if(connection.playerId){
        const room=RoomManager.Instance.joinRoom(rid,connection.playerId)
        if(room){
            //如果有房间创建了就同步一下玩家和房间列表
            PlayerManager.Instance.syncPlayers()
            RoomManager.Instance.syncRooms()
            //同步房间消息
            RoomManager.Instance.syncRoom(room.id)
            return {
                room:RoomManager.Instance.getRoomView(room)
            }
        }else{
            throw new error("房间不存在")
        }
    }else{
        //这个异常抛出给Connection的on“message”的trycatch捕获到
        throw new error("未登录")
    }
    
})

/**
 * 离开房间的API
 */
server.setApi(ApiMsgEnum.ApiRoomLeave,(connection:Connection,data:IApiRoomLeaveReq):IApiRoomLeaveRes=>{
    
    //先判断有没有连接
    if(connection.playerId){
        const player = PlayerManager.Instance.idMapPlayer.get(connection.playerId)
        if(player){
            const rid = player.rid
            if(rid){
                RoomManager.Instance.leaveRoom(rid,player.id)
                //如果有房间创建了就同步一下玩家和房间列表
                PlayerManager.Instance.syncPlayers()
                RoomManager.Instance.syncRooms()
                //同步房间消息
                RoomManager.Instance.syncRoom(rid)
                return {
                }
            }else{
                throw new error("房间不存在")
            }
        }else{
            throw new error("玩家不存在")
        }
        
    }else{
        //这个异常抛出给Connection的on“message”的trycatch捕获到
        throw new error("未登录")
    }
    
})


/**
 * 开始游戏
 */
server.setApi(ApiMsgEnum.ApiGameStart,(connection:Connection,data:IApiGameStartReq):IApiGameStartRes=>{   
    //先判断有没有连接
    if(connection.playerId){
        const player = PlayerManager.Instance.idMapPlayer.get(connection.playerId)
        if(player){
            const rid = player.rid
            if(rid){
                RoomManager.Instance.startRoom(rid)
                //如果有房间创建了就同步一下玩家和房间列表
                PlayerManager.Instance.syncPlayers()
                RoomManager.Instance.syncRooms()
                //同步房间消息
                RoomManager.Instance.syncRoom(rid)
                return {}
            }else{
                throw new error("房间不存在")
            }
        }else{
            throw new error("玩家不存在")
        }
    }else{
        //这个异常抛出给Connection的on“message”的trycatch捕获到
        throw new error("未登录")
    }
    
})
/**
 * 游戏结束
 */
server.setApi(ApiMsgEnum.ApiGameEnd,(connection:Connection,data:IApiGameEndReq):IApiGameEndRes=>{   
    //先判断有没有连接
    if(connection.playerId){
        const player = PlayerManager.Instance.idMapPlayer.get(connection.playerId)
        if(player){
            const rid = player.rid
            if(rid){
                RoomManager.Instance.closeRoom(rid)
                PlayerManager.Instance.syncPlayers()
                RoomManager.Instance.syncRooms()
                return {}
            }else{
                throw new error("房间不存在")
            }
        }else{
            throw new error("玩家不存在")
        }
    }else{
        //这个异常抛出给Connection的on“message”的trycatch捕获到
        throw new error("未登录")
    }
    
})

server.start().then(()=>{
    console.log("服务启动！")
})
.catch((e)=>{
    console.log(e)
})


// // 创建一个数组来存储所有客户端的输入值
// let inputs=[]

// // 当有新的客户端连接时触发
// wss.on("connection",(socket)=>{
//     // 监听客户端发送的消息
//     socket.on("message",(buffer)=>{
//         const str  = buffer.toString()
//         //客户端发送的数据可能不是有效的 JSON 格式，所以需要使用 try catch 来捕获错误
//         try {
//             // 将字符串转换为对象
//             const msg = JSON.parse(str)
//             // 结构化数据
//             const {name,data}=msg
//             const {frameId,input}=data
//             // 将input添加到inputs数组中
//             inputs.push(input)
//         } catch (e) {
//             console.log(e)
//         }
//     })
//     // 每100ms发送一次服务端同步给客户端
//     setInterval(()=>{
//         //
//         const temp = inputs
//         inputs=[]
//         const msg = {
//         name:ApiMsgEnum.MsgServerSync,
//         data:{
//             inputs:temp,
//         },
//         }
//         // 将对象转换为 JSON 字符串并发送给客户端
//         socket.send (JSON.stringify(msg))
//     },100)
//     // 创建一个对象
//     // const obj = {
//     //     name:'haha',
//     //     data:'haha123',
//     // }
//     // // 将对象转换为 JSON 字符串并发送给客户端
//     // socket.send (JSON.stringify(obj))
// })
// // 当服务器开始监听时触发
// wss.on("listening",()=>{
//     console.log("服务启动!!!")
// })